home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / UNIXLIB37B / !UnixLib37 / src / signal / c / sigpreempt < prev    next >
Text File  |  1996-11-09  |  2KB  |  69 lines

  1. /****************************************************************************
  2.  *
  3.  * $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigpreempt,v $
  4.  * $Date: 1996/10/30 22:04:51 $
  5.  * $Revision: 1.1 $
  6.  * $State: Rel $
  7.  * $Author: unixlib $
  8.  *
  9.  * $Log: sigpreempt,v $
  10.  * Revision 1.1  1996/10/30 22:04:51  unixlib
  11.  * Initial revision
  12.  *
  13.  ***************************************************************************/
  14.  
  15. static const char rcs_id[] = "$Id: sigpreempt,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
  16.  
  17. /* Signal pre-emption implementation.  */
  18.  
  19. #include <errno.h>
  20. #include <signal.h>
  21. #include <unixlib/sigstate.h>
  22. #include <sys/unix.h>
  23.  
  24. int unixlib_preempt_signals (struct unixlib_signal_preempt *preempter,
  25.                      int signo, int first_code, int last_code,
  26.                      sighandler_t (*handler) (int, int, int))
  27. {
  28.   if (signo <= 0 || signo >= NSIG)
  29.     {
  30.       errno = EINVAL;
  31.       return -1;
  32.     }
  33.   preempter->first = first_code;
  34.   preempter->last = last_code;
  35.   preempter->handler = handler;
  36.   preempter->next = __u->sigpreempt[signo];
  37.   __u->sigpreempt[signo] = preempter;
  38.  
  39.   return 0;
  40. }
  41.  
  42. /* Remove PREEMPTER from the chain for SIGNO.  */
  43.  
  44. int
  45. unixlib_unpreempt_signals (struct unixlib_signal_preempt *preempter, int signo)
  46. {
  47.   struct unixlib_signal_preempt *p, *lastp;
  48.  
  49.   if (signo <= 0 || signo >= NSIG)
  50.     {
  51.       errno = EINVAL;
  52.       return -1;
  53.     }
  54.  
  55.   for (p = __u->sigpreempt[signo], lastp = NULL;
  56.        p != NULL; lastp = p, p = p->next)
  57.     if (p == preempter)
  58.       {
  59.         if (lastp == NULL)
  60.           __u->sigpreempt[signo] = p->next;
  61.         else
  62.           lastp->next = p->next;
  63.     return 0;
  64.       }
  65.   __u->sigpreempt[signo] = preempter;
  66.   errno = ENOENT;
  67.   return -1;
  68. }
  69.